﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using SaludOcupacional.DataAccess;
using SaludOcupacional.Exceptions;
using SaludOcupacional.Model;

namespace SaludOcupacional.Controller
{
    public class UsuariosManager
    {
        public static bool ValidateEmail(string email)
        {
            string expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";

            if (Regex.IsMatch(email, expresion))
            {
                if (Regex.Replace(email, expresion, String.Empty).Length == 0)
                { return true; }
                else
                { return false; }
            }
            else
            { return false; }
        } // end methid ValidateEmail

        public static void EditUser(Usuario editusuario)
        {
            if (editusuario == null)
                throw new LoginException("El usuario No Puede Ser Nulo!");

            if (editusuario.Email != "" && ValidateEmail(editusuario.Email) == false)
            {
                throw new LoginException("Email Invalido. Porfavor Verifique.");
            }


            using (UsuarioDataAccess daccess = new UsuarioDataAccess())
            {
                daccess.EditUser(editusuario);
            }
        }

        public static void ChangePassword(string login, string newPass)
        {
            if (string.IsNullOrEmpty(login))
                throw new ArgumentNullException("login");
            if (string.IsNullOrEmpty(newPass))
                throw new ArgumentNullException("newPass");

            if(newPass.Length < 8)
                throw new LoginException("El Password Nuevo debe ser de 8-16 Caracteres!");

            using (UsuarioDataAccess daccess = new UsuarioDataAccess())
            {
                daccess.ChangePassword(login,newPass);
            }
        }

        public static void Createuser(Usuario usuario)
        {
            if (usuario == null)
                throw new LoginException("El usuario No Puede Ser Nulo!");

            if(usuario.Login == "")
            {
                throw new LoginException("Ingrese Login!");
            }
            if (usuario.Password == "")
            {
                throw new LoginException("Ingrese Password");
            }

            if (usuario.Email != "" && ValidateEmail(usuario.Email) == false)
            {
                throw new LoginException("Email Invalido. Porfavor Verifique.");
            }

            if (usuario.Password.Length < 8)
                throw new LoginException("El Password Nuevo debe ser de 8-16 Caracteres!");



            using (UsuarioDataAccess daccess = new UsuarioDataAccess())
            {
                daccess.CreateUsuario(usuario);
            }
        }

        public static void ValidarNuevoUsuario(string login, string password, string nombre,
                                                                 string paterno, string materno )
        {
            if( login == "")
                throw new LoginException("Ingrese Login");


            if (password == "")
                throw new LoginException("Ingrese Password");

            if (password.Length < 8)
                throw new LoginException("El Password Nuevo debe ser de 8-16 Caracteres!");
            if (nombre == "")
                throw new LoginException("Ingrese Nombre");
            if (paterno == "")
                throw new LoginException("Ingrese Apelldio Paterno");
            if (materno == "")
                throw new LoginException("Ingrese Apellido Materno");
            

        }

        public static void ValidarEditarUsuario(string login, string privilegio, string nombre, string paterno, string materno)
        {
            if (login == "")
                throw new LoginException("Ingrese Login");


            if (privilegio == "")
                throw new LoginException("Ingrese Password");

           
            if (nombre == "")
                throw new LoginException("Ingrese Nombre");
            if (paterno == "")
                throw new LoginException("Ingrese Apelldio Paterno");
            if (materno == "")
                throw new LoginException("Ingrese Apelldio Paterno");
        }


        public static Collection<Usuario> BuscarUsuarioPorNombre(string nombre)
        {
            if (nombre == "")
                throw new LoginException("Ingrese nombre");
            using (UsuarioDataAccess daccess = new UsuarioDataAccess())
            {
                Collection<Usuario> userCollection = new Collection<Usuario>();
                userCollection = daccess.BuscarUsuarioPorNombre(nombre);
                return userCollection;
            }

        }

        public static void CambiarEstadousuario(string login)
        {
            if (string.IsNullOrEmpty(login))
                throw new ArgumentNullException("login");


            using (UsuarioDataAccess daccess = new UsuarioDataAccess())
            {
                Usuario usuario = new Usuario();
                usuario = daccess.GetUserByUserName(login);
                if(usuario.Stado == "vigente")
                {
                    daccess.CambiarEstadoUsuario(login, "baneado");
                }
                else
                {
                    daccess.CambiarEstadoUsuario(login, "vigente");
                }
            }

        }


        public static Usuario BuscarUsuarioPorLogin(string login)
        {
            Usuario resp;
            using (UsuarioDataAccess daccess = new UsuarioDataAccess())
            {

                resp = daccess.BuscarUsuarioPorLogin(login);
                return resp;
            }
        }

    }
}
